﻿using System.ComponentModel;
using System.Data;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using TeacherLoad.Classes;

namespace TeacherLoad.Windows
{
    /// <summary>
    /// Логика взаимодействия для GroupList.xaml
    /// </summary>
    public partial class GroupList : Window
    {
        private bool _editMode = false;
        private static int _id = 0;
        private static UchGroup _group;
        private static readonly List<UchGroup> emptyGroupList = new List<UchGroup>()
        {
            new UchGroup()
        };

        public GroupList()
        {
            InitializeComponent();
            cbSpec.DataContext = LoadSpec();        // Загрузка списка специальностей
            DataGroup.DataContext = LoadGroup();    // Загрузка списка групп
            cbSpec.Items.SortDescriptions.Add(new SortDescription("Code", ListSortDirection.Ascending));    // Сортировка специальностей по возрастанию кода
            listGroup.Items.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending)); // Сортировака групп по названию группы
        }

        /// <summary>
        /// Загрузка списка специальностей
        /// </summary>
        /// <returns></returns>
        private List<Specialization> LoadSpec()
        {
            DataTable dt = SendToServer.GetSpec();
            List<Specialization> spec = new List<Specialization>();
            if (dt.Rows.Count != 0)
            {
                foreach (DataRow row in dt.Rows)
                {
                    Specialization sp = new Specialization(
                        Convert.ToInt32(row[0]),
                        row[1].ToString(),
                        row[2].ToString(),
                        row[3].ToString());
                    spec.Add(sp);
                }
            }
            return spec;
        }

        /// <summary>
        /// Загрузка списка групп
        /// </summary>
        /// <returns></returns>
        private List<UchGroup> LoadGroup()
        {
            DataTable dt = SendToServer.GetGroup();
            List<UchGroup> groupList = new List<UchGroup>();
            if (dt.Rows.Count != 0)
            {
                foreach (DataRow row in dt.Rows)
                {
                    UchGroup sp = new UchGroup(
                        id: Convert.ToInt32(row[0]),
                        course: Convert.ToInt32(row[1]),
                        name: Convert.ToString(row[2]),
                        idSpec: Convert.ToInt32(row[3]),
                        beginYear: Convert.ToInt32(row[4]),
                        idUchPlan: Convert.ToInt32(row[5]),
                        specName: Convert.ToString(row[6]));
                    groupList.Add(sp);
                }
                ChangeRow.IsEnabled = true;
            }
            else
            {
                groupList = emptyGroupList;
                ChangeRow.IsEnabled = false;
            }
            return groupList;
        }

        /// <summary>
        /// Загрузка списка учебных планов по данной специальности
        /// </summary>
        /// <returns></returns>
        private List<UchPlan> LoadUchPlan()
        {
            DataTable dt = SendToServer.GetUchPlan(Convert.ToInt32(cbSpec.SelectedValue));
            List<UchPlan> planList = new List<UchPlan>();
            if (dt.Rows.Count != 0)
            {
                foreach (DataRow row in dt.Rows)
                {
                    UchPlan pl = new UchPlan(
                        id: Convert.ToInt32(row[0]),
                        year: Convert.ToInt32(row[1]),
                        idSpec: Convert.ToInt32(row[2]));
                    planList.Add(pl);
                }
            }
            return planList;
        }

        /// <summary>
        /// Проверка года начала обучения.
        /// Допускается 4-х значное целое число
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ValidationYear(object sender, TextCompositionEventArgs e)
        {
            Regex regex = new Regex("[^0-9]");
            if (txBeginYear.Text.Length < 4)
            {
                e.Handled = regex.IsMatch(e.Text);
            }
            else
            {
                e.Handled = true;
            }
        }

        /// <summary>
        /// Проверка номера курса.
        /// Допускается только число от 1 до 5.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ValidationCours(object sender, TextCompositionEventArgs e)
        {
            Regex regex = new Regex("[^1-5]");
            if (txCourse.Text.Length < 1)
            {
                e.Handled = regex.IsMatch(e.Text);
            }
            else
            {
                e.Handled = true;
            }
        }

        private void btnAddGroup_Click(object sender, RoutedEventArgs e)
        {
            int currentYear = DateTime.Now.Year;
            // Проверяем, что обзательные поля заполнены (специальность, название, курс и год поступления)
            if (cbSpec.SelectedIndex == -1 ||
                txNameGroup.Text == string.Empty ||
                txCourse.Text == string.Empty ||
                txBeginYear.Text == string.Empty ||
                cbUchPlan.SelectedIndex == -1)
            {
                MessageBox.Show("Заполните обязательные поля", "Проверьте поля ввода",
                    MessageBoxButton.OK, MessageBoxImage.Warning);
                return;
            }
            if (Convert.ToInt16(txBeginYear.Text) > currentYear)
            {
                MessageBox.Show("Год поступления не может быть больше текущего года", 
                    "Проверьте год поступления",
                    MessageBoxButton.OK, MessageBoxImage.Warning);
                return;
            }
            int idSpec = Convert.ToInt32(cbSpec.SelectedValue);
            int idUchPlan = Convert.ToInt32(cbUchPlan.SelectedValue);
            //_spec = cbSpec.SelectedItem as Specialization;
            UchGroup group = new UchGroup(
                _id, 
                Convert.ToInt16(txCourse.Text),
                txNameGroup.Text,
                idSpec,
                Convert.ToInt16(txBeginYear.Text),
                idUchPlan
                );
            if (_editMode)
            {
                // Изменение записи
                if (SendToServer.EditGroup(group))
                {
                    ClearTextBox();     // Очищаем поля ввода
                    UpdateUi();         // Обновляем интерфейс
                    _editMode = false;  // Выходим из режима редактирования
                }
                else
                {
                    MessageError();     // Ошибка операции
                    return;
                }
            }
            else
            {
                if (SendToServer.AddGroup(group))
                {
                    ClearTextBox();     // Очищаем поля ввода
                }
                else
                {
                    MessageError();     // Ошибка операции
                    return;
                }
            }
            DataGroup.DataContext = LoadGroup();
        }
        private void MessageError()
        {
            MessageBox.Show("Ошибка записи", "Неудача",
                        MessageBoxButton.OK, MessageBoxImage.Error);
        }

        private void listGroup_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (listGroup.SelectedItems.Count > 0)
            {
                _group = listGroup.SelectedItem as UchGroup;
            }
        }

        

        private void ChangeRow_Click(object sender, RoutedEventArgs e)
        {
            if (listGroup.SelectedItems.Count > 0)
            {
                _editMode = true;   // Установка режима редактирования

                HeaderGroupAdd.Header = "Обновить данные";
                btnAddGroup.Content = "Обновить";
                btnCancelEdit.Visibility = Visibility.Visible;

                cbSpec.SelectedValue = _group.IdSpec;

                txNameGroup.Text = _group.Name;
                txCourse.Text = _group.Course.ToString();
                txBeginYear.Text = _group.BeginYear.ToString();
                
                // Получаем идентификатор (id) выделенной группы
                _id = _group.Id;
            }
        }

        
        private void btnCancelEdit_Click(object sender, RoutedEventArgs e)
        {
            UpdateUi();
            ClearTextBox();
        }

        private void ClearTextBox()
        {
            cbSpec.SelectedIndex = -1;
            txCourse.Clear();
            txNameGroup.Clear();
            txBeginYear.Clear();
        }
        private void UpdateUi()
        {
            HeaderGroupAdd.Header = "Новая группа";
            btnAddGroup.Content = "Добавить группу";
            btnCancelEdit.Visibility = Visibility.Hidden;
        }

        
        private void cbSpec_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (cbSpec.SelectedIndex != -1)
            {
                cbUchPlan.DataContext = LoadUchPlan();
                cbUchPlan.SelectedIndex = -1;
            }
            else
            {
                cbUchPlan.ItemsSource = null;
            }
        }
    }
}
